﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

public class TutorialScreen : GameScreen
{
    public enum TutorialKind
    {
        MOVE,
        DIALOG,
        ITEM,
        THOUGHT
    }

    private TutorialKind kind;

    private Texture2D back, dark;
    private SpriteFont font, font2;

    string title = "";
    string text = "";

    public TutorialScreen( TutorialKind kind)
    {
        this.kind = kind;
        Globals.IsPaused = true;
        
        GameSession.ScreenManager.GameRef.IsMouseVisible = false;

        IsPopup = true;
    }

    public override void LoadContent()
    {
        base.LoadContent();

        dark = GameSession.Content.Load<Texture2D>("Textures/dark");
        back = GameSession.Content.Load<Texture2D>("Textures/Screen/Post-it2");

        switch (kind)
        {
            case TutorialKind.MOVE:
                title = "Movendo";
                text = "Para mover seu personagem pelo mapa use os direcionais do teclado. \n Quando seu personagem chegar perto de algo que pode interagir uma lâmpada aparecerá sobre ele. E para interagir com esse personagem basta apertar ESPACO ou ENTER. \n Para mostrar ou ocultar os dados do seu personagem aperte BACKSPACE. ";
                break;
            case TutorialKind.ITEM:
                title = "Interagindo";
                text = "Nesta tela você pode clicar nos objetos para conseguir informações. \n Você deve usar o mouse para posicionar o cursor e clicar para interagir. \n Nem todos os objetos são interagíveis. \n O número na parte de baixo da tela indica quantos objetos você ainda pode interagir, mas não necessariamente o número de objetos que está na tela.";
                break;
            case TutorialKind.DIALOG:
                title = "Conversando";
                text = "Nesta tela você pode conversar com os personagens para conseguir informações. \n Na parte de cima está o que o outro personagem está falando e embaixo as suas opções de resposta. \n Essas opções variam de acordo com seus itens e atributos.";
                break;
            case TutorialKind.THOUGHT:
                title = "Pensamento";
                text = "Sempre antes de uma interação poderá aparecer o que o seu personagem está pensando. \n Você pode apertar ESPAÇO para realmente interagir ou apertar ESC e não interagir.";
                break;
        }

        font = GameSession.Content.Load<SpriteFont>("SpriteFont1");
        font2 = GameSession.Content.Load<SpriteFont>("SpriteFont2");
    }

    double time = 0;

    public override void Update(GameTime gameTime, bool otherScreenHasFocus, bool coveredByOtherScreen)
    {
        if (time == 0)
        {
            time = gameTime.TotalGameTime.TotalMilliseconds;
        }

        if (time + 3000 < gameTime.TotalGameTime.TotalMilliseconds)
            HandleInput();
    }

    public override void Draw(GameTime gameTime)
    {
        base.Draw(gameTime);

        SpriteBatch spriteBatch = ScreenManager.SpriteBatch;

        spriteBatch.Begin();

        spriteBatch.Draw(dark, Vector2.Zero, Color.White);

        int y = Globals.ScreenHeight/2 - back.Height/2;

        spriteBatch.Draw(back, new Vector2(Globals.ScreenWidth/2 - back.Width/2, y), Color.White) ;

        spriteBatch.DrawString(font2, title, new Vector2(Globals.ScreenWidth / 2 - font2.MeasureString(title).X / 2, y += 20), Color.Black);

        DrawString(spriteBatch, Globals.ScreenWidth/2, y + 50);

        spriteBatch.End();
    }

    private void DrawString(SpriteBatch spriteBatch, int x, int y)
    {
        string[] aux = text.Split(' ');

        string textLine = "";

        foreach(string str in aux)
        {
            if (font.MeasureString(textLine).X + font.MeasureString(str).X > 400 || str.Equals("\n") || str.Equals(aux.ElementAt(aux.Length - 1)))
            {
                if(str.Equals(aux.ElementAt(aux.Length - 1)))
                    textLine += str + " ";

                spriteBatch.DrawString(font, textLine, new Vector2(x - font.MeasureString(textLine).X / 2, y +=20), Color.Black);
                if (str.Equals("\n"))
                    spriteBatch.DrawString(font, "", new Vector2(x - font.MeasureString(textLine).X / 2, y += 20), Color.Black);

                textLine = "";
            }
            if (!str.Equals("\n"))
                textLine += str + " ";
        }
    }

    public override void HandleInput()
    {
        base.HandleInput();

        MouseState state = Mouse.GetState();

        if (InputManager.IsActionTriggered())
        {
            Exit();
        }

        if (kind == TutorialKind.ITEM && state.LeftButton == ButtonState.Pressed)
            Exit();
    }

    private void Exit()
    {
        if(kind == TutorialKind.MOVE)
            Globals.IsPaused = false;

        if(kind == TutorialKind.ITEM)
            GameSession.ScreenManager.GameRef.IsMouseVisible = true;

        ExitScreen();
    }

}
